When designing a system on an FPGA, one primary objective is to clock the system at its fastest speed. Clock speed is limited by the longest register to register path delay in the design. A circuit is operational with respect to register setup if the time for data to propagate between registers is less than the clock period of the clock which clocks the registers. If the speed of a clock is such that a destination register latches data before the data is propagated from its source, the circuit will fail to operate.
In a large circuit, there is a range of different delays between each source and destination register. In the past, designers have attempted to optimize a clocking network by utilizing register re-timing techniques to affect the longest delay of a data path. Register re-timing involves moving sequential elements, such as registers, forward and backwards in a logic design. Register re-timing may create or delete registers in the design and change the temporal behavior of some internal registers while leaving the functionality of the design intact. When performed appropriately, register re-timing balances the paths between registers to decrease the worst-case delay.
Register re-timing, however, suffers the drawback of being difficult to implement in a design flow. Register re-timing is difficult to perform early in the design flow because it relies on estimates of timing which are inaccurate in the early stages of the design flow. Register re-timing is also difficult to perform late in the design flow because it requires replacing or modifying a netlist generated during synthesis which introduces further complications.
Thus, what is needed is an improved method and apparatus for designing a circuit to allow the circuit to operate at its fastest clock speed.